"""
配置管理组件
负责处理和验证配置参数
"""
from typing import Dict, Any, Optional, TypeVar, cast

T = TypeVar('T')

class ConfigManager:
	"""配置管理器，负责处理和验证配置"""
	
	def __init__(self, config: Dict[str, Any]):
		"""
		初始化配置管理器
		
		Args:
			config: 配置字典
		"""
		self.raw_config = config or {}
		
	def get(self, key: str, default: Optional[T] = None) -> Any:
		"""
		获取配置值
		
		Args:
			key: 配置键
			default: 默认值
			
		Returns:
			配置值
		"""
		return self.raw_config.get(key, default)
		
	def get_provider_type(self) -> str:
		"""
		获取提供商类型
		
		Returns:
			提供商类型
		"""
		return self.get('provider', 'unknown')
		
	def get_model(self) -> str:
		"""
		获取模型名称
		
		Returns:
			模型名称
		"""
		return self.get('model', '')
		
	def get_api_settings(self) -> Dict[str, Any]:
		"""
		获取API设置
		
		Returns:
			API设置字典
		"""
		return {
			'api_key': self.get('api_key'),
			'api_base': self.get('api_base'),
			'proxy': self.get('proxy'),
			'timeout': self.get('timeout', 60)
		}
		
	def get_retry_settings(self) -> Dict[str, Any]:
		"""
		获取重试设置
		
		Returns:
			重试设置字典
		"""
		return {
			'max_retries': self.get('max_retries', 3),
			'retry_delay': self.get('retry_delay', 1.0),
			'retry_strategy': self.get('retry_strategy', 'exponential')
		}
		
	def get_completion_settings(self) -> Dict[str, Any]:
		"""
		获取补全设置
		
		Returns:
			补全设置字典
		"""
		return {
			'temperature': self.get('temperature', 0.1),
			'max_tokens': self.get('max_tokens', 4096),
			'top_p': self.get('top_p', 1.0),
			'presence_penalty': self.get('presence_penalty', 0.0),
			'frequency_penalty': self.get('frequency_penalty', 0.0),
		}
		
	def get_remote_settings(self) -> Dict[str, Any]:
		"""
		获取远程设置（针对远程提供商）
		
		Returns:
			远程设置字典
		"""
		return {
			'api_key': self.get('api_key'),
			'api_base': self.get('api_base'),
			'proxy': self.get('proxy')
		}
		
	def get_local_settings(self) -> Dict[str, Any]:
		"""
		获取本地设置（针对本地提供商）
		
		Returns:
			本地设置字典
		"""
		return {
			'host': self.get('host', 'localhost'),
			'port': self.get('port', 8000),
			'timeout': self.get('timeout', 60)
		}
		
	def is_remote_provider(self) -> bool:
		"""
		检查当前配置是否为远程提供商
		
		Returns:
			是否为远程提供商
		"""
		from ..core.constants import REMOTE_PROVIDERS
		provider_type = self.get_provider_type()
		return provider_type in REMOTE_PROVIDERS
		
	def is_local_provider(self) -> bool:
		"""
		检查当前配置是否为本地提供商
		
		Returns:
			是否为本地提供商
		"""
		from ..core.constants import LOCAL_PROVIDERS
		provider_type = self.get_provider_type()
		return provider_type in LOCAL_PROVIDERS
		
	def validate(self) -> None:
		"""
		验证配置有效性，如果无效则抛出异常
		
		Raises:
			ConfigurationError: 如果配置无效
		"""
		from ..core.exceptions import ConfigurationError
		
		provider_type = self.get_provider_type()
		
		# 验证远程提供商需要API密钥
		if self.is_remote_provider():
			api_key = self.get('api_key')
			if not api_key:
				raise ConfigurationError(f"未提供{provider_type}的API密钥", provider_type)
			
		# 验证模型名称
		model = self.get_model()
		if not model:
			# 针对不同提供商设置默认模型
			if provider_type == "anthropic":
				self.raw_config['model'] = "claude-3-5-sonnet"
			elif provider_type == "openai":
				self.raw_config['model'] = "gpt-4-turbo"
			elif provider_type == "moonshot":
				self.raw_config['model'] = "moonshot-v1-8k"
			elif provider_type == "ollama":
				self.raw_config['model'] = "llama3"
